//
//  PPScaleManager.h
//  PPBlueToothDemo
//
//  Created by 彭思远 on 2020/7/31.
//  Copyright © 2020 彭思远. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "PPScaleDefine.h"
#import "PPDeviceModel.h"
#import "PPBodyBaseModel.h"
#import "PPBodyHistoryBaseModel.h"
#import "PPBodyFatModel.h"
#import "PPUserModel.h"
#import <CoreBluetooth/CoreBluetooth.h>
#import "PPScaleFormatTool.h"
#import "PPDataAnalysisHandler.h"
#import "PPUnitTool.h"

@class PPScaleManager;


/// 状态相关的回调方法
@protocol PPBleStateInterface <NSObject>

@optional

/// 监听设备蓝牙工作状态
/// @param state  设备工作状态
- (void)monitorBluetoothWorkState:(PPBleWorkState)state;


/// 监听蓝牙开关状态
/// @param state 开关状态
- (void)monitorBluetoothSwitchState:(CBManagerState)state API_AVAILABLE(ios(10.0));


/// 监听蓝牙权限状态
/// @param state 权限状态
- (void)monitorBluetoothAuthorState:(CBManagerAuthorization)state API_AVAILABLE(ios(13.0));

@end


/// 数据相关回调方法
@protocol PPDataInterface <NSObject>

@optional


/// 过程数据回调
/// @param manager 蓝牙管理对象
/// @param model 基础数据模型
- (void)scaleManager:(PPScaleManager *)manager monitorProcessData:(PPBodyBaseModel *)model;


/// 锁定数据回调
/// @param manager 蓝牙管理对象
/// @param model   身体数据模型
- (void)scaleManager:(PPScaleManager *)manager monitorLockData:(PPBodyFatModel *)model;


/// 历史数据回调
/// @param manager 蓝牙管理对象
/// @param model 历史数据模型
- (void)scaleManager:(PPScaleManager *)manager monitorHistorData:(PPBodyHistoryBaseModel *)model;

/// 设备的sn
/// @param manager 蓝牙管理对象
/// @param sn 设备的sn
- (void)scaleManager:(PPScaleManager *)manager monitorSerialNumberString:(NSString *)sn;


/// 光照强度变化
/// @param illumination 光照强度
- (void)scaleManager:(PPScaleManager *)manager monitorIlluminationChange:(NSInteger) illumination;


- (void)scaleManager:(PPScaleManager *)manager monitorCAScaleProcessData:(PPBodyBaseModel *)model;

@end


/// 设备相关回调方法
@protocol PPDeviceInterface <NSObject>

@optional

/// 附近发现的设备
/// @param manager  蓝牙管理对象
/// @param model 设备对象
- (void)scaleManager:(PPScaleManager *)manager monitorSurroundDevice:(PPDeviceModel *)model;

@end


/// ota回调方法
@protocol PPOtaInterface <NSObject>

- (void)readyForStartOTA:(PPScaleManager *)manager;

- (void)scaleManager:(PPScaleManager *)manager monitorOTAProgress:(CGFloat)progress;

@end


/// 蓝牙管理对象
@interface PPScaleManager : NSObject


///  状态代理
@property (nonatomic, weak) id<PPBleStateInterface> stateInterface;

///  数据代理
@property (nonatomic, weak) id<PPDataInterface> dataInterface;

///  ota代理
@property (nonatomic, weak) id<PPOtaInterface> otaInterface;

/// 设备代理
@property (nonatomic, weak) id<PPDeviceInterface> deviceInterface;

///如果是自定义的蓝牙名称，可以根据这里进行过滤
@property (nonatomic, copy) NSArray <NSString *> *deviceNameArr;

#pragma mark - 蓝牙连接和获取数据
#pragma mark - 连接已绑定过的设备


/// 初始化方法
/// @param addressList 设备的Mac地址，以数组的方式传入,可以为nil。当对象有值，在搜索附近蓝牙设备的时候，只会返回mac包含在该对象内的设备。如果为nil将会搜索所有设备。
/// @param userModel 用户模型
- (instancetype)initWithMacAddressList:(NSArray <NSString *>*)addressList andUserModel:(PPUserModel *)userModel;


/// 连接指定mac的设备
/// @param addressList 设备的Mac地址，以数组的方式传入, 可以为nil。当对象有值，只会连接mac包含在该对象内的设备。 如果为nil会随机连接搜索到的设备。
- (void)connectWithMacAddressList:(NSArray <NSString *>*)addressList;


/// 开始搜索附近设备。
/// 如果遵循了“PPDeviceInterface”并且“deviceInterface”不为空，调用此方法后会在“scaleManager: monitorSurroundDevice:”回调中返回附近符合标准的设备。
/// 如果未遵循了“PPDeviceInterface”并且“deviceInterface”为空，调用此方法后会搜索附近的符合标准的设备并直接进行连接。
- (void)startSearching;

/// 重新搜索搜索附近设备
/// 如果遵循了“PPDeviceInterface”并且“deviceInterface”不为空，调用此方法后会在“scaleManager: monitorSurroundDevice:”回调中返回附近符合标准的设备。
/// 如果未遵循了“PPDeviceInterface”并且“deviceInterface”为空，调用此方法后会搜索附近的符合标准的设备并直接进行连接。
- (void)reStartSearching;


/// 停止扫描
/// 若当前有设备处于连接状态调用该方法也会断开连接
- (void)disconnect;


/// 当前连接的外设
- (PPDeviceModel *)currentDevice;


/// 获取全部历史数据
- (BOOL)fetchHistoryData;

/// 删除全部历史数据
- (BOOL)deleteHistoryData;

/// 与外设同步时间
- (BOOL)syncTime2Scale;

/// 与外设同步信息（单位、模式）
- (BOOL)syncSchema2Scale;

#pragma mark - 闭目单脚测量的相关方法


/// 断开闭目单脚设备同时停止扫描
- (void)disconnectBMScale;

/// 闭目单脚秤进入开始状态
/// @param start 状态回调函数
- (void)BMScaleStartTiming:(void(^)(BOOL isSuccess))start;

/// 闭目单脚秤进入退出状态
/// @param exit 状态回调函数
- (void)BMScaleExitTiming:(void(^)(BOOL isSuccess))exit;


/// 闭目单脚持续时间
/// @param timeInterval 回调函数（
/// isEnd 是否结束
/// timeInterval 持续时间
/// isFailed 是否测量失败
- (void)BMScaleTimeInterval:(void(^)(BOOL isEnd, NSInteger timeInterval, BOOL isFailed))timeInterval;

#pragma mark - 蓝牙配网的相关方法


/// 蓝牙WiFi设备配网方法
/// @param ssid 待配置路由器的ssid
/// @param password 待配置路由器的password
/// @param handler 回调函数
///  isSuccess 配置是否成功
///  sn 被配置设备的sn(唯一标识)
- (void)configNetWorkWithSSID:(NSString *)ssid password:(NSString *)password andSuccessHandler:(void(^)(BOOL isSuccess, NSString *sn))handler;

#pragma mark - 开发者模式写入指令


/// 开发者模式下写入指令
/// @param codes 指令 数组形式
/// @param handler 回调方法
/// reviceData 蓝牙设备的回复内容
- (void)writeDeveloperCommands:(NSArray *)codes withReciveDataHandler:(void(^)(NSData *reviceData))handler;


/// 进入内码模式
- (BOOL)enterInsideModel;

/// 进入休眠模式
- (BOOL)enterSleepModel;


/// OTA数据升级
/// @param data OTA的数据
- (void)ota:(NSData *)data;


- (void)otaUpdate;


- (void)changeDNS:(NSString *)dns withReciveDataHandler:(void(^)(BOOL isSuccess))handler;

#pragma mark - Torre协议相关

/// 切换单位
/// @param currentUnit 当前单位
- (void)torreChangeUnitWithSuccessHandler:(void(^)(BOOL isSuccess))handler;



/// 给Torre设备同步用户（将APP端所有用户信息同步给设备）
/// @param infos 数组对象，包含用户信息
/// @param handler 指令完成状态
- (void)torreSyncAllUserInfo:(NSArray <PPUserModel *>*)infos andSuccessHandler:(void(^)(BOOL isSuccess))handler;


/// 选定Torre秤上的用户
/// @param userModel 用户信息
- (void)torreSelectUser:(PPUserModel *)userModel andSuccessHandler:(void(^)(BOOL isSuccess))handler;


/// 给Torre设备下发数据指令
/// @param code 指令内容
/// @param reciveHandler 设备回复
- (void)sendTorreData:(NSString *)code reciveHandler:(void(^)(NSData *reciveData)) reciveHandler;


/// 给Torre设备下发命令指令
/// @param code 指令内容
/// @param reciveHandler 设备回复
- (void)sendTorreCode:(NSString *)code reciveHandler:(void(^)(NSData *reciveData)) reciveHandler;


/// Torre设备同步日志
/// @param handler 进度和文件路径
- (void)torreSyncLogsWithProgressHandler:(void(^)(CGFloat progress, NSString *filePath, BOOL isFailed))handler;


/// Torre设备获取周边的WiFi设备信息
/// @param handler 设备回复
- (void)torreFetchSSIDAround:(void(^)(NSArray *arr))handler;


/// Torre设备配网
/// @param ssid 账号
/// @param password 密码
/// @param domain 域名
/// @param handler 设备回复
- (void)torreConfigNetWorkWithSSID:(NSString *)ssid password:(NSString *)password domain:(NSString *)domain andSuccessHandler:(void(^)(PPWIFIConfigState state, NSData *errorCode))handler;


/// Torre设备退出配网模式
- (void)torreExitWifiConfigModel;

/// Torre设备删除秤端用户
/// @param userId
/// @param memberId
/// @param handler
- (void)torreDeleteUserByUserId:(NSString *)userId memberId:(NSString *)memberId andSuccessHandler:(void(^)(BOOL isSuccess))handler;


- (void)torreFetchUserID:(void(^)(NSArray *infos))handler;


/// Torre设备同步时间
/// @param handler
- (void)torreSyncCurrentDeviceTimeWithSuccessHandler:(void(^)(BOOL isSuccess))handler;

- (void)torreFetchHistoryDataByUser:(PPUserModel *)userMode andResultHandler:(void(^)(NSArray <PPBodyHistoryBaseModel *>*history))handler;


- (void)torreOtaUpdateWithProgressHandler:(void(^)(CGFloat progress, BOOL isFailed))handler;

#pragma mark - 厨房秤相关API
/// 切换单位
/// @param currentUnit 当前单位
- (void)caChangeUnit:(PPUserUnit)currentUnit;

/// 去皮/清零
- (void)caToZero;


/// 修改蜂鸣器开关
/// @param open open description
- (void)caBuzzerChangeGate:(BOOL)open;


/// 同步厨房秤时间
/// @param date 时间对象
- (void)caChangeTime:(NSDate *)date;
@end




